home *** CD-ROM | disk | FTP | other *** search
- /*
- * http_alias.c: Stuff for dealing with directory aliases
- *
- * Rob McCool
- *
- */
-
-
- #include "httpd.h"
-
- typedef struct {
- char fake[MAX_STRING_LEN];
- char real[MAX_STRING_LEN];
- int script;
- } alias;
-
- static int num_a = 0;
- static alias a[MAX_ALIASES];
- static int num_v = 0;
- static alias v[MAX_ALIASES];
-
- void reset_aliases() {
- num_a = 0;
- num_v = 0;
- }
-
- void add_alias(char *f, char *r, int is_script) {
- strcpy(a[num_a].fake,f);
-
- a[num_a].script = is_script;
- if(r[0] != '/')
- make_full_path((is_script ? server_root : document_root),r,
- a[num_a++].real);
- else
- strcpy(a[num_a++].real,r);
- }
-
- void add_redirect(char *f, char *url) {
- strcpy(v[num_v].fake,f);
- strcpy(v[num_v++].real,url);
- }
-
- int translate_name(char *name, FILE *fd) {
- register int x,l;
- char dname[MAX_STRING_LEN];
- char w[MAX_STRING_LEN];
- char t[MAX_STRING_LEN];
- struct passwd *pw;
-
- getparents(name);
-
- for(x=0;x<num_v;x++) {
- l=strlen(v[x].fake);
- if(!strncmp(name,v[x].fake,l)) {
- strsubfirst(l,name,v[x].real);
- return -1;
- }
- }
-
- for(x=0; x < num_a; x++) {
- l=strlen(a[x].fake);
- if(!strncmp(name,a[x].fake,l)) {
- strsubfirst(l,name,a[x].real);
- return(a[x].script);
- }
- }
-
- if((user_dir[0]) && (name[0] == '/') && (name[1] == '~')) {
- strcpy(dname,&name[2]);
- getword(w,dname,'/');
- if(!(pw=getpwnam(w)))
- die(NOT_FOUND,name,fd);
- make_full_path(pw->pw_dir,user_dir,t);
- make_full_path(t,dname,name);
- return 0;
- }
- /* no alias, add document root */
- strsubfirst(0,name,document_root);
- return 0;
- }
-
- void unmunge_name(char *name) {
- register int x,l;
-
- l=strlen(document_root);
- if(!strncmp(name,document_root,l)) {
- strsubfirst(l,name,"");
- if(!name[0]) {
- name[0] = '/';
- name[1] = '\0';
- }
- return;
- }
- for(x=0;x < num_a; x++) {
- l=strlen(a[x].real);
- if(!strncmp(name,a[x].real,l)) {
- strsubfirst(l,name,a[x].fake);
- if(!name[0]) {
- name[0] = '/';
- name[1] = '\0';
- }
- return;
- }
- }
- }
-